/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Principals;

import Algorithm.Algoritmo;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.Random;

/**
 *
 * @author walter
 */
public class Utils {

    public static final int LARGO_MAPA = 10;
    public static final int ANCHO_MAPA = 20;
    private static int DATA_EMPLEADO;
    private static int DATA_CLIENTE;
    private static int DATA_PRODUCTO;
    private static int DATA_VEHICULO;
    private static int DATA_PUNTOS = 200;
    private static String[] estadosMaestros = { "Eliminado" , "Disponible" , "En ruta" ,"En mantenimiento", "Malogrado"} ;
    private static String[] estadosEmpleado = { "Eliminado" , "Disponible" , "En ruta" } ;

    public static String getEstadoMaestro( int idx ){
        return estadosMaestros[ idx ] ;
    }
    
    public static String getEstadoEmpleado( int idx ){
        return estadosEmpleado[ idx ] ;
    }
    
    public static int getRandom(int max) {
        if (max == 0) return -1;
        Random r = new Random();
        return r.nextInt(max);
    }

    public static int getRandomInRange(int min, int max) {
        Random r = new Random();
        int num = r.nextInt(max - min + 1);
        return min + num;
    }

    public static int diffHourMinutes(Date first, Date second) {
        return (int) (second.getTime() - first.getTime()) / 60000;
    }

    public static int diffHourEmpleado(Date first) {
        Date second = new Date();
        SimpleDateFormat sdf = new SimpleDateFormat("HH:mm");
        String sh1 = sdf.format(first);
        String sh2 = sdf.format(second);

        int h1 = Integer.parseInt(sh1.substring(0, 1)) * 60 + Integer.parseInt(sh1.substring(3, 4));
        int h2 = Integer.parseInt(sh2.substring(0, 1)) * 60 + Integer.parseInt(sh2.substring(3, 4));
        return h2 - h1;
    }

    public static String formatDate(Date date) {
        if (date == null) {
            return "";
        }
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        return sdf.format(date);
    }

    public static String formatDateWithHours(Date date) {
        if( date == null ) return "" ;
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm");
        return sdf.format(date);
    }

    public static boolean betweenDate(Date ini, Date fin, Date date) {
        SimpleDateFormat sdf = new SimpleDateFormat("HH:mm");
        String d1 = sdf.format(ini);
        String d2 = sdf.format(fin);
        String d3 = sdf.format(date);
        return (d1.compareTo(d3) <= 0 && d3.compareTo(d2) <= 0);
    }

    public static Date addMinutesToDate(Date date, int minutes) {
        Calendar cal = Calendar.getInstance();
        cal.setTime(date);
        cal.add(Calendar.MINUTE, minutes);
        return cal.getTime();
    }
    
    public static String getDateBeforeMonths(int monthsBefore) {
        Calendar cal = Calendar.getInstance();
        int aleatoryMonths = getRandomInRange(1, monthsBefore);
        cal.add(Calendar.MONTH, -aleatoryMonths);
        cal.set(Calendar.DATE, getRandomInRange(1, cal.getActualMaximum(Calendar.DATE)));
        cal.set(Calendar.HOUR, getRandomInRange(1, 23));
        cal.set(Calendar.MINUTE, getRandomInRange(0, 59));
        return formatDateWithHours(cal.getTime());
    }
    
    public static Date getDateMinutesBefore( int minutes ){
        Calendar cal = Calendar.getInstance() ;
        cal.add( Calendar.MINUTE , -minutes ) ;
        return cal.getTime() ;
    }
    
    public static Date toDate( String fecha ){
        int year = Integer.parseInt( fecha.substring( 0 , 4 ) ) ;
        int month = Integer.parseInt( fecha.substring( 5 , 7 ) ) ;
        int day = Integer.parseInt( fecha.substring( 8 , 10 ) ) ;
        int hour = Integer.parseInt( fecha.substring( 11 , 13 ) ) ;
        int minutes = Integer.parseInt( fecha.substring( 14 , 16 ) ) ;
        
        Calendar cal = Calendar.getInstance() ;
        cal.set( Calendar.YEAR , year ) ;
        cal.set( Calendar.MONTH , month -1 ) ;
        cal.set( Calendar.DATE , day ) ;
        cal.set( Calendar.HOUR , hour ) ;
        cal.set( Calendar.MINUTE , minutes ) ;
        
        return cal.getTime() ;
    }

    private static String generateNumericString(int len) {
        String numeros = "1234567890";
        String cad = "";
        for (int i = 0; i < len; i++) {
            cad += numeros.charAt(getRandom(numeros.length()));
        }
        return cad;
    }
    
    public static String[] getEstadosMaestro(){
        return estadosMaestros;
    }
    
    public static String[] getEstadosEmpleado(){
        return estadosEmpleado;
    }

    //<editor-fold defaultstate="collapsed" desc="Deprecated">
    public static void generarArchivos(int numArch) throws IOException {
        File archPedidos = new File("pedidos" + numArch + ".txt");
        File archVehiculos = new File("vehiculos" + numArch + ".txt");
        File archEmpleados = new File("empleados" + numArch + ".txt");
        File archMapa = new File("mapa" + numArch + ".txt");

        int numPedidos = getRandomInRange(60, 70);
        int numMotos = getRandomInRange(5, 20);
        int numAutos = getRandomInRange(2, 10);

        /**
         * ***********PEDIDOS************
         */
        FileWriter EscPedidos = new FileWriter(archPedidos);
        EscPedidos.write(numPedidos + "\n");
        ArrayList lista = new ArrayList(LARGO_MAPA * ANCHO_MAPA);
        //Se crea una lista con todos los puntos del mapa            
        for (int j = 1; j <= numPedidos; j++) {
            lista.add(j);
        }
        //Se toman de los puntos en el mapa la cantidad de pedidos solicitados
        for (int k = 0; k < numPedidos; k++) {
            int posPedido = getRandom(lista.size());
            EscPedidos.write(lista.get(posPedido) + "\n");
            lista.remove(posPedido);
        }
        EscPedidos.close();

        /**
         * ***********VEHICULOS************
         */
        FileWriter EscVehiculos = new FileWriter(archVehiculos);
        EscVehiculos.write(numMotos + "\n");
        EscVehiculos.write(numAutos + "\n");
        EscVehiculos.close();

        /**
         * ***********EMPLEADOS************
         */
        FileWriter EscEmpleados = new FileWriter(archEmpleados);
        //int numEmpM=getRandomInRange(5,numMotos);
        //int numEmpA=getRandomInRange(2,numAutos);
        //int numEmp=numMotos+numAutos;
        EscEmpleados.write(numMotos + "\n");
        EscEmpleados.write(numAutos + "\n");
        EscEmpleados.close();

        /**
         * ***********MAPA************
         */
        FileWriter EscMapa = new FileWriter(archMapa);
        EscMapa.write(LARGO_MAPA + "\n");
        EscMapa.write(ANCHO_MAPA + "\n");
        int numNodos = LARGO_MAPA * ANCHO_MAPA;
        for (int j = 0; j < numNodos; j++) {
            for (int k = 0; k < j + 1; k++) {
                EscMapa.write(Utils.getRandomInRange(1, Algoritmo.MAX_DIST) + "\n");
            }
        }
        EscMapa.close();
    }

    private static void generarInsertsMapa() throws Exception {
        FileWriter fw = new FileWriter(new File("caminos.txt"));
        int largo = LARGO_MAPA ;
        int ancho = ANCHO_MAPA ;
        for (int i = 0; i < largo; i++) {
            for (int j = 0; j < ancho; j++) {
                fw.write("INSERT INTO punto_mapa ( latitud , longitud , direccion ) VALUES ( " + i + " , " + j + " , 'Cruce Av. " + i + " con Calle " + j + "' ) ;\n");
            }
        }

        int dx[] = {0, 1};
        int dy[] = {1, 0};
        int idxActual = 0;
        for (int i = 0; i < largo; i++) {
            for (int j = 0; j < ancho; j++) {
                idxActual = i * ancho + j + 1;
                for (int k = 0; k < 2; k++) {
                    int nx = i + dx[ k];
                    int ny = j + dy[ k];
                    if (nx < 0 || ny < 0 || nx >= largo || ny >= ancho) {
                        continue;
                    }
                    int idxFinal = idxActual + (k == 0 ? 1 : ancho);
                    int d = getRandomInRange( 1 , 3 ) ;
                    fw.write("INSERT INTO camino ( punto_inicial , punto_final , distancia , estado ) VALUES ( " + idxActual + " , " + idxFinal + " , " + d + " , " + 1 + " ) ;\n");
                    fw.write("INSERT INTO camino ( punto_inicial , punto_final , distancia , estado ) VALUES ( " + idxFinal + " , " + idxActual + " , " + d + " , " + 1 + " ) ;\n");
                }
            }
        }
        fw.close();
    }
    //</editor-fold>
    
    //<editor-fold defaultstate="collapsed" desc="Generación de data histórica">
    private static void generarDataHistorica(){
        generarDatosCliente( 10 ) ;
        generarDatosProducto( 5 ) ;
        generarDatosVehiculo( 5 ) ;
        generarDatosEmpleado( 10 ) ;
        generarDatosPedido( getRandomInRange( 40 , 90 ) ) ;
    }

    private static void generarDatosCliente(int n) {
        try {
            DATA_CLIENTE = n;
            PrintWriter pw = new PrintWriter(new File("cliente.txt"));
            for (int i = 0; i < n; i++) {
                pw.println("Cliente " + (i + 1));
                pw.println("Ap Pat " + (i + 1));
                pw.println("Ap Mat " + (i + 1));
                pw.println("Direccion " + (i + 1));
                pw.println(generateNumericString(10));
                pw.println("cliente" + (i + 1) + "@dp1.com");
                pw.println(generateNumericString(8));
            }
            pw.close();
        } catch (Exception e) {
            System.out.println("error en generar datos cliente");
        }
    }

    private static void generarDatosProducto(int n) {
        try {
            DATA_PRODUCTO = n;
            PrintWriter pw = new PrintWriter(new File("producto.txt"));
            int costo;
            for (int i = 0; i < n; i++) {
                pw.println("Producto " + (i + 1));
                pw.println(costo = getRandomInRange(1, 40)); // costo
                pw.println(getRandomInRange(costo+20, 200)); // precio lista
                pw.println(getRandomInRange(22, 100)); // stock
            }
            pw.close();
        } catch (Exception e) {
            System.out.println("error en generar datos producto");
        }
    }

    private static void generarDatosVehiculo(int n) {
        try{
            DATA_VEHICULO = n;
            PrintWriter pw = new PrintWriter(new File("vehiculo.txt"));
            for (int i = 0; i < n; i++) {
                pw.println(generateNumericString(9)); // placa
                pw.println( getRandomInRange( 2011 , 2013 ) ); // anho
                pw.println(getRandomInRange(2, 3)); // tipo vehiculo
            }
            pw.close();
        } catch (Exception e) {
            System.out.println("error en generar datos vehiculo");
        }
    }

    private static void generarDatosEmpleado(int n) {
        try {
            DATA_EMPLEADO = n;
            PrintWriter pw = new PrintWriter(new File("empleado.txt"));
            pw.println( n ) ;
            for(int i = 0 ; i < n/3 ; i++)
                for(int j = 0 ; j < 3 ; j++){
                    int idx = 3 * i + j + 1 ;
                    pw.println("Empleado " + idx);
                    pw.println("Ap Pat " + idx);
                    pw.println("Ap Mat " + idx);
                    pw.println("Direccion " + idx);
                    pw.println(generateNumericString(10)); // telefono
                    pw.println("empleado" + idx + "@dp1.com");
                    pw.println(generateNumericString(8)); // dni
                    pw.println(j+1); // turno
                    pw.println( idx <= 6 ? 2 : 3 ) ; // tipo vehiculo
                    pw.println(generateNumericString(9)); // nro brevete
                    pw.println( 2 ) ; // perfil conductor
                }
            pw.close();
        } catch (Exception e) {
            System.out.println("error en generar datos empleado");
        }
    }

    private static void generarDatosPedido(int n) {
        try {
            PrintWriter pw = new PrintWriter(new File("pedido.txt"));
            for (int i = 0; i < n; i++) {
                pw.println(getRandomInRange(1, DATA_PRODUCTO)); // producto
                pw.println(getRandomInRange(1, DATA_PUNTOS)); // punto_mapa
                pw.println(getRandomInRange(1, DATA_CLIENTE)); // cliente
                pw.println("Direccion " + (i + 1)); // direccion
                pw.println(getDateBeforeMonths(1)); // fecha_registro
            }
            pw.close();
        } catch (Exception e) {
            System.out.println("error en generar datos pedido");
        }
    }
    //</editor-fold>

    public static void main(String[] args) {
        try {
            generarDatosEmpleado( 33 ) ;
        } catch (Exception e) {
        }
    }
}
